# 异步运行 playwright
from playwright.async_api import async_playwright
import asyncio
import time

async def main():
    async with async_playwright() as p:
        # await:等待元素定位到并再执行
        browser = await p.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()
        try:
            # referer="https://www.taobao.com"表示访问百度的请求是从淘宝页面发起的。
            # wait_until="load"表示等待页面完全加载完成。
            # 模拟一个用户从淘宝网站跳转到百度网站的行为，并等待百度页面完全加载
            await page.goto("https://www.baidu.com", timeout=30000, referer="https://www.taobao.com", wait_until="load")
            await page.wait_for_timeout(1000)  # 等待1秒
            print(await page.title())  # 打印网页标题栏
            time.sleep(2)

            # 一、键盘事件 **********
            # await page.locator('//*[@id="kw"]').fill('PO设计模式\n')   # 输入文本并回车
            # await page.fill('//*[@id="kw"]', 'PO设计模式')  # await page.locator('//*[@id="kw"]').fill('PO设计模式')
            # 逐个字符输入（模拟真实打字）
            await page.type("#kw", "PO设计模式", delay=100)  # 每个字符间隔 100ms
            await page.locator('text="百度一下"').click()   # await page.click('text="百度一下"')
            time.sleep(3)
            # 打印所有搜索内容
            lcs = await page.locator(".content-right_2s-H4").all()
            for lc in lcs:
                print(await lc.inner_text())
            # 同步模式（Python）   键盘事件：1、方向键：ArrowUp/Down/Left/Right 2、回车、制表符：Enter, Tab 3、删除键：Backspace, Delete 4、修饰键：Control, Alt, Shift, Meta (Command)
            # await page.keyboard.press("Control+A")  # 全选
            # await page.keyboard.press("Control+C")  # 复制
            # await page.keyboard.press("ArrowDown")  # 按下箭头键

            # 异步模式（Python）
            await page.keyboard.press("Shift+Enter")  # 换行


            # 二、鼠标事件 **********
            # # 将元素拖拽到目标位置
            # await page.drag_and_drop("#source", "#target")
            # # 手动控制拖拽过程
            # await page.locator("#source").hover()
            # await page.mouse.down()   # 长按
            # await page.locator("#target").hover()
            # await page.mouse.up()   # 释放
            # 模拟鼠标移动路径
            await page.mouse.move(100, 100)  # 移动到坐标 (x=100, y=100)
            await page.mouse.wheel(0, 500)  # 垂直滚动 500 像素
            time.sleep(3)

            # 鼠标事件：双击：page.dblclick("#item")   右键单击：page.click("#button", button="right")
            # 鼠标悬停事件  设置
            await page.hover('//*[@id="u"]/a[2]', timeout=3000)
            # 点击高级搜索
            await page.locator('text="高级搜索"').click(timeout=3000)

            # 三、浏览器事件：
            # # 1、# 监听并自动接受弹窗（alert/confirm/prompt）
            # page.on("dialog", lambda dialog: await dialog.accept("确定"))
            #
            # # 显式处理弹窗
            # dialog = await page.wait_for_event("dialog")
            # print(await dialog.message)
            # await dialog.dismiss()  # 或 dialog.accept()
            # # 监听下载事件
            # async with page.expect_download() as download_info:
            #     await page.click("#download-button")
            # download = await download_info.value
            # print(f"下载文件路径: {await download.path()}")


        finally:
            time.sleep(3)
            await p.stop()


if __name__ == '__main__':
    asyncio.run(main())








